import java.util.*;


public class BocadilloImpl implements Bocadillo {
	
	private C_pedido pedido;
	private C_producto orejas;
	
	private Vector<C_producto> productos_j1;
	private Vector<C_producto> productos_j2;
	
	public BocadilloImpl(C_pedido pedido){
		this.pedido=pedido;
		productos_j1=new Vector<C_producto>();
		productos_j2=new Vector<C_producto>();
		orejas=null;
	}


	//A�ade una carta a la lista de productos del bocadillo seg�n el jugador
	public void add_producto(C_producto prod, Integer jug) throws CartaIncorrectaException {
		if(jug!=1 && jug!=2)
			throw new IllegalArgumentException("N�mero de jugador incorrecto");
		
		if(prod.get_id()==2/*comodin*/){
			if(jug==1)
				productos_j1.add(prod);
			else
				productos_j2.add(prod);
		}else if(prod.get_id()==0/*orejas*/){
			if(orejas==null)
				throw new CartaIncorrectaException("No se puede a�adir ese producto");
			else {
				if(esta(prod.get_id(),jug)>0)
					throw new CartaIncorrectaException("No se puede a�adir ese producto");
				else{
					if(jug==1)
						productos_j1.add(prod);
					else
						productos_j2.add(prod);
				}
			}
		}else if(esta(prod.get_id())==0)
				throw new CartaIncorrectaException("No se puede a�adir ese producto");
		else if(esta(1,jug)==2)
			throw new CartaIncorrectaException("No se puede a�adir ese producto");
		else {
			if(jug==1 && productos_j1.isEmpty()){
				if(prod.get_id()==1/*Pan negro*/)
					productos_j1.add(prod);
				else
					throw new CartaIncorrectaException("No se puede a�adir ese producto");
								
			}else if(jug==2 && productos_j2.isEmpty()){
				if(prod.get_id()==1/*Pan negro*/)
					productos_j2.add(prod);
				else
					throw new CartaIncorrectaException("No se puede a�adir ese producto");
			}else if(jug==1 && esta(prod.get_id())==1){
				if(esta(prod.get_id(),jug)==0)
					productos_j1.add(prod);
				else
					throw new CartaIncorrectaException("No se puede a�adir ese producto");
			}else if(jug==2 && esta(prod.get_id())==1){
				if(esta(prod.get_id(),jug)==0)
					productos_j2.add(prod);
				else
					throw new CartaIncorrectaException("No se puede a�adir ese producto");

			}else if(jug==1 && esta(prod.get_id())==2){
				if(esta(prod.get_id(),jug)!=2)
					productos_j1.add(prod);
				else
					throw new CartaIncorrectaException("No se puede a�adir ese producto");

			}else if(jug==2 && esta(prod.get_id())==2){
				if(esta(prod.get_id(),jug)!=2)
					productos_j2.add(prod);
				else
					throw new CartaIncorrectaException("No se puede a�adir ese producto");
					
			}
		}
		
		
	}
	//Asigna un pedido al bocadillo
	public void asignar_pedido(C_pedido pedido){
		this.pedido=pedido;
	}
	//Marca si el bocadillo necesita orejas de elfo
	public void colocar_orejas(C_producto orejas){
		this.orejas=orejas;
	}
	//Comprueba si un producto est� en el pedido
	//Devuelve el n�mero de veces que aparece el ingrediente en el pedido
	public int esta(Integer n){
		Iterator<Integer> it=pedido.get_ingredientes().iterator();
		int nveces=0;
		while(it.hasNext()){
			if(it.next()==n)
				nveces++;
		}
		return nveces;
	}
	//Comprueba si una carta est� en la lista de productos del bocadillo seg�n el jugador
	//Devuelve el n�mero de veces que est� el producto
	public int esta(Integer n, Integer j){
		int nveces=0;
		Iterator<C_producto> it1=productos_j1.iterator();
		Iterator<C_producto> it2=productos_j2.iterator();
		if(j==1){
			while(it1.hasNext()){
				if(it1.next().get_id()==n)
					nveces++;
			}
		}
		else{
			while(it2.hasNext()){
				if(it2.next().get_id()==n)
					nveces++;
			}
		}
		return nveces;
	}
	
	//Devuelve el pedido asignado	
	public C_pedido get_pedido (){
		return this.pedido;
	}
	public Vector <C_producto> get_puestos (Integer jugador){
		if(jugador!=1 && jugador!=2)
			throw new IllegalArgumentException("Numero de jugador incorrecto");
		return (jugador==1?productos_j1:productos_j2);
	}
	
	public Vector <C_producto> descartar(){
		Vector <C_producto> descartes=new Vector<C_producto>();
		descartes.addAll(this.productos_j1);
		this.productos_j1.removeAllElements();
		descartes.addAll(this.productos_j2);
		this.productos_j2.removeAllElements();
		if (orejas!=null){
			descartes.add(orejas);
			orejas=null;
			}
		return descartes;	
		
	}
	public Boolean necesita_orejas(){
		return (orejas!=null);
	}
	public Boolean tiene_comodin(Integer jugador){
	    return (esta(2,jugador)==1);
	}
	public Integer entregar(Integer jugador){
	    int faltan;
	    if (esta (1,jugador)!=2 || (necesita_orejas() && esta(0,jugador)!=1))
	        faltan=-1; //si no estan los 2 panes negros o las orejas de elfo si son necesarias o
	                       //de haber comodin, la carta elegida no esta en el pedido o sobra en el bocadillo
	    else{
	        faltan=pedido.get_ingredientes().size()-(jugador==1?productos_j1:productos_j2).size();
	        if (necesita_orejas())
	            faltan++;
	    }
	    return faltan;

	}
	 public Integer entregar(Integer jugador, Integer comodin){
	    int faltan;
	    if ((esta (1,jugador)!=2 || (necesita_orejas() && esta(0,jugador)!=1 && comodin!=0)) ||
	        (comodin!=-1 && comodin!=0 && esta(comodin)<=esta(comodin,jugador)))
	    	faltan=-1; //si no estan los 2 panes negros o las orejas de elfo si son necesarias o
	                       //de haber comodin, la carta elegida no esta en el pedido o sobra en el bocadillo
	    else{
	        faltan=pedido.get_ingredientes().size()-(jugador==1?productos_j1:productos_j2).size();
	        if (necesita_orejas())
	            faltan++;
	    }
	    return faltan;
	}
}
